import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import * as portfinder from 'portfinder';
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
import * as fs from 'fs';
import { JwtAuthGuard } from './common/authentication/JwtAuthGuard';
import { ResponseInterceptor } from './common/interceptor/response.interceptor';
async function bootstrap() {
  // 创建 Nest 应用程序实例
  const app = await NestFactory.create(AppModule);
  // 使用 Nest 的依赖注入机制获取 JwtAuthGuard 的实例
  const jwtAuthGuard = app.get(JwtAuthGuard);
  app.useGlobalGuards(jwtAuthGuard); // 设置全局守卫
  // 全局拦截器
  app.useGlobalInterceptors(new ResponseInterceptor());
  // 获取默认端口，如果环境变量 PORT 存在则使用其值，否则使用 3000
  const defaultPort = Number(process.env.PORT) || 3000;

  try {
    // 查找可用端口并启动应用程序
    const port = await portfinder.getPortPromise({ port: defaultPort });
    await app.listen(port);
    console.log(`Application is running on: http://localhost:${port}`);

    // 配置 Swagger 接口文档
    const options = new DocumentBuilder()
      .setTitle('API 文档标题') // 设置文档标题
      .setDescription('API 文档描述') // 设置文档描述
      .setVersion('1.0') // 设置文档版本
      .build();
      
    // 创建 Swagger 文档
    const document = SwaggerModule.createDocument(app, options);
    
    // 将 Swagger 文档写入 swagger.json 文件
    fs.writeFileSync('./swagger.json', JSON.stringify(document, null, 2));
    
    // 设置 Swagger 的访问路径
    SwaggerModule.setup('api', app, document);
  } catch (err) {
    // 捕获并输出启动应用程序时的错误
    console.error('Error starting the application:', err);
  }
}

bootstrap();
